package jwt

import (
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"time"
)

// 定义密钥（用于签名）
var secretKey = []byte("jC4=yV1+hO7*jL3_hR1[iN8]gM2=qH5]")

// GenerateToken 生成 JWT Token
func GenerateToken(uuid string) (string, error) {
	// 创建 JWT 负载
	claims := jwt.MapClaims{
		"uuid": uuid,
		"exp":  time.Now().Add(time.Hour * 24 * 30).Unix(), // 过期时间 30天
		"iat":  time.Now().Unix(),                          // 签发时间
	}

	// 创建 Token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 进行签名
	return token.SignedString(secretKey)
}

func parseToken(tokenString string) (*jwt.Token, error) {
	return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 确保使用的是正确的签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, errors.New("unexpected signing method")
		}
		return secretKey, nil
	})
}

// ValidateToken 验证token
func ValidateToken(tokenString string) (uuid string, err error) {
	token, err := parseToken(tokenString)
	if err != nil {
		return "", err
	}

	// 验证 Token 是否有效
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		uuid, ok := claims["uuid"].(string)
		if !ok {
			return "", errors.New("invalid uuid")
		}
		return uuid, nil
	}

	return "", errors.New("token is invalid")
}
